package day11_JigsawPuzzle;

import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

public class GameJFrame extends JFrame implements KeyListener, ActionListener {

    int[][] data=new int[4][4];
    int x=0,y=0;
    String path="image\\animal\\animal3";            //定义路径
    int[][] win={
            {1,2,3,4},
            {5,6,7,8},
            {9,10,11,12},
            {13,14,15,16}
    };
    int step=0;
    //创建选项下面的条目对象
    JMenuItem replayItem=new JMenuItem("重新游戏");
    JMenuItem reLoginItem=new JMenuItem("重新登录");
    JMenuItem closeItem=new JMenuItem("关闭游戏");
    JMenuItem accountItem=new JMenuItem("公众号");

    public GameJFrame() {
        //初始化界面
        initJFrame();

        //初始化菜单
        initMenu();

        //初始化数据
        initData();

        //初始化图片
        initImage();

        //显示出来
        this.setVisible(true);
    }


    private void initJFrame() {
        //设置界面的宽高
        this.setSize(603, 680);
        //设置界面的标题
        this.setTitle("拼图单机版 v1.0");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        //取消默认的居中放置，只有取消才能按照xy轴的方式添加组件
        setLayout(null);
        //给整个界面添加监视事件
        this.addKeyListener(this);
    }

    private void initMenu() {
        //创建整个菜单对象
        JMenuBar jMenuBar = new JMenuBar();

        //创建菜单上面的两个选项的对象（功能 关于我们）
        JMenu functionJMenu=new JMenu("功能");
        JMenu aboutJMenu=new JMenu("关于我们");

        //将每一个选项下面的条目添加到选项当中
        functionJMenu.add(replayItem);
        functionJMenu.add(reLoginItem);
        functionJMenu.add(closeItem);
        aboutJMenu.add(accountItem);

        //给条目绑定事件
        replayItem.addActionListener(this);
        reLoginItem.addActionListener(this);
        closeItem.addActionListener(this);
        accountItem.addActionListener(this);

        //将菜单里面的两个选项添加到菜单当中
        jMenuBar.add(functionJMenu);
        jMenuBar.add(aboutJMenu);

        //给整个界面设置菜单
        this.setJMenuBar(jMenuBar);
    }

    private void initData() {
        int[] tempArr={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
        Random r=new Random();
        for(int i=0;i<tempArr.length;i++){
            int index=r.nextInt(tempArr.length);
            int temp=tempArr[i];
            tempArr[i]=tempArr[index];
            tempArr[index]=temp;
        }
        for(int i=0;i<tempArr.length;i++){
            if(tempArr[i]==0){
                x=i/4;
                y=i%4;
            }
            data[i/4][i%4]=tempArr[i];
        }
    }

    //初始化图片
    private void initImage(){
        //清空原本出现的所有图片
        this.getContentPane().removeAll();
        if(victory()){
            JLabel winJLabel=new JLabel(new ImageIcon("image\\win.png"));
            winJLabel.setBounds(203,283,197,73);
            this.getContentPane().add(winJLabel);
        }

        JLabel stepCount=new JLabel("步数："+step);
        stepCount.setBounds(50,30,100,20);
        this.getContentPane().add(stepCount);

        for(int i=0;i<4;i++){
            for(int j=0;j<4;j++){
                int num=data[i][j];
                //创建一个JLabel的对象(管理容器)
                JLabel jLabel=new JLabel(new ImageIcon(path+"//"+num+".jpg"));
                //指定图片位置
                jLabel.setBounds(105*j+83, 105*i+134,105, 105);
                //给图片添加边框，0让图片凸起来，1让图片凹下去
                jLabel.setBorder(new BevelBorder(1));
                //把管理容器添加到界面中
                this.getContentPane().add(jLabel);
            }
        }
        //添加背景图片
        JLabel background=new JLabel(new  ImageIcon("image\\background.png"));
        background.setBounds(40,40,508,560);
        this.getContentPane().add(background);
        //先加载的图片在上方，后加载的图片在下方

        //刷新一下界面
        this.getContentPane().repaint();
    }


    @Override
    public void keyTyped(KeyEvent e) {

    }

    //按下不松时
    @Override
    public void keyPressed(KeyEvent e) {
        int code=e.getKeyCode();
        if(code==65){
            this.getContentPane().removeAll();
            JLabel all=new JLabel(new ImageIcon(path+"\\all.jpg"));
            all.setBounds(83,134,420,420);
            this.getContentPane().add(all);
            //添加背景图片
            JLabel background=new JLabel(new  ImageIcon("image\\background.png"));
            background.setBounds(40,40,508,560);
            this.getContentPane().add(background);
            //先加载的图片在上方，后加载的图片在下方

            //刷新一下界面
            this.getContentPane().repaint();
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
        //游戏胜利后，停止调用该方法
        if(victory()){
            return;
        }

        //对上，下，左，右进行判断
        //左37，上38，右39，下40
        int code=e.getKeyCode();
        if(code==37){
            if(y==3) return;
            data[x][y]=data[x][y+1];
            data[x][y+1]=0;
            y++;
            step++;
            initImage();
        }else if(code==38){
            if(x==3) return;
            data[x][y]=data[x+1][y];
            data[x+1][y]=0;
            x++;
            step++;
            initImage();
        }else if(code==39){
            if(y==0) return;
            data[x][y]=data[x][y-1];
            data[x][y-1]=0;
            y--;
            step++;
            initImage();
        }else if(code==40){
            if(x==0) return;
            data[x][y]=data[x-1][y];
            data[x-1][y]=0;
            x--;
            step++;
            initImage();
        }else if(code==65){
            initImage();
            for(int i=0;i<4;i++){
                for(int j=0;j<4;j++){
                    int num=data[i][j];
                    //创建一个JLabel的对象(管理容器)
                    JLabel jLabel=new JLabel(new ImageIcon(path+"//"+num+".jpg"));
                    //指定图片位置
                    jLabel.setBounds(105*j+83, 105*i+134,105, 105);
                    //给图片添加边框，0让图片凸起来，1让图片凹下去
                    jLabel.setBorder(new BevelBorder(1));
                    //把管理容器添加到界面中
                    this.getContentPane().add(jLabel);
                }
            }
        }else if(code==87){
            data=win;
            initImage();
        }
    }

    public boolean victory(){
        for(int i=0;i<data.length;i++){
            for(int j=0;j<data[i].length;j++){
                if(data[i][j]!=win[i][j]){
                    return false;
                }
            }
        }
        return true;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        //获取当前被点击的对象
       Object obj=e.getSource();
       if(obj==replayItem){
           step=0;
           initData();
           initImage();
       }
       else if(obj==reLoginItem){
            //关闭当前的服务界面
           this.setVisible(false);
           //打开登陆界面
           new LoginJFrame();
       }
       else if(obj==closeItem){
           System.exit(0);
       }
       else if(obj==accountItem){
           //创建弹窗对象
           JDialog jDialog=new JDialog();
           //创建一个管理图片的容器JLabel
           JLabel jLabel=new JLabel(new ImageIcon("image//about.jpg"));
           //设置位置和宽高
           jLabel.setBounds(0,0,258,258);
           //把图片添加到弹窗中
           jDialog.getContentPane().add(jLabel);
           //给弹窗设置大小
           jDialog.setSize(344,344);
           //让弹窗置顶
           jDialog.setAlwaysOnTop(true);
           //让弹窗居中
           jDialog.setLocationRelativeTo(null);
           //弹窗不关闭无法操作下面的界面
           jDialog.setModal(true);
           //显示出来
           jDialog.setVisible(true);
       }
    }

}
